package cn.rslee.demo.spring.mybatis.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import cn.rslee.demo.spring.mybatis.entity.AccessLog;
import cn.rslee.demo.spring.mybatis.entity.AccessLogCount;

/**
 * 描述：
 * 
 * <pre>HISTORY
 * ****************************************************************************
 *  ID   DATE                     PERSON          REASON
 *  1    2016年6月16日       rslee                Create
 * ****************************************************************************
 * </pre>
 * @author rslee
 * @since 1.0
 * 
 * 基于注解方式实现CRUD+分页+排序
 * 
 * 具体使用和配置参考如下链接：
 * {@link http://www.mybatis.org/spring/}
 * 
 */
public interface AccessLogMapper {

	@Insert("INSERT INTO uaas_user_access_log (SYS_CODE, UA, CLIENT_IP, SERVER_IP, URL, URI, REFERRER, USERNAME, VISIT_TM) VALUES "
			+ "(#{sysCode}, #{ua}, #{clientIp}, #{serverIp}, #{url}, #{uri}, #{referrer}, #{username}, #{visitTm})")  
	@Options(useGeneratedKeys=true, keyProperty="id")  // 这个是基于mysql的自增组件的方案，参考http://www.tuicool.com/articles/7nmQnuM
    public void save(AccessLog log);  
      
    @Delete("delete from uaas_user_access_log where id = #{id}")  
    public void delete(long id);  
      
    @Update("update uaas_user_access_log set SYS_CODE = #{sysCode}, USERNAME = #{username} where id = #{id}")  
    public void update(AccessLog log);  
      
    @Select("select * from uaas_user_access_log where id = #{id}")  
    public AccessLog findOne(long id);  
      
    @Select("select * from uaas_user_access_log")  
    public List<AccessLog> findAll(); 
    
    //按照用户名+系统编码查询数据
    @Select("select * from uaas_user_access_log where USERNAME=#{username} and SYS_CODE=#{sysCode}")  
    public List<AccessLog> findBy(@Param("username") String username,@Param("sysCode") String sysCode);
    
    // 分页查询数据。
    // 分页通常来说需要查询两次，一次是查询具体的记录条数，一次是查询分页限制的条数。
    // 我这边简单实现一个分页类，指定id排序，避免出现重复数据的问题
    
    @Select("select * from uaas_user_access_log  order by id limit #{from} , #{size}")  
    public List<AccessLog> findByLimit(@Param("from") int from,@Param("size") int size);
    
    @Select("select count(*) from uaas_user_access_log")  
    public long findCountBy();
    
    //按照条件动态排序,参考http://blog.csdn.net/weibing_huang/article/details/7368556  这里不用# 而是改为$符号，不进行转义。ps:潜在安全风险,建议传入前做枚举
    @Select("select * from uaas_user_access_log where USERNAME=#{username} order by ${order}")  
    public List<AccessLog> findByOrder(@Param("username") String username,@Param("order") String order);
    
    //group by 汇总数据。这个对象就不是标准的实体类对象了，需要做点映射
    @Select("select ${groupBy} as groupBy,count(*) as count from uaas_user_access_log group by ${groupBy}")  
    public List<AccessLogCount> groupBy(@Param("groupBy") String groupBy);
   
    
    
}
